package com.dc.project.workflow.service;

import com.dc.common.core.ActFowDto;
import com.dc.common.vo.PageResultVo;
import com.dc.project.workflow.dto.FlowData;
import com.dc.project.workflow.vo.*;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.engine.repository.Model;
import org.springframework.util.MultiValueMap;

import java.util.Map;

/**
 * @author zhuangcy
 * @date 2021/6/5
 * @description 模型库服务接口
 */
public interface ActFlowService {
    /**
     * 查询模型列表
     *
     * @param vo
     * @return
     */
    PageResultVo<ProcessModelVo> queryModelPage(ProcessQueryVo vo);

    /**
     * 创建流程模型
     *
     * @param modelVo
     * @return 流程模型ID
     */
    String createModel(ModelVo modelVo);

    /**
     * 发布模型实例
     *
     * @param modelId
     * @return
     */
    Model publishModel(String modelId);

    /**
     * 删除流程实例
     *
     * @param modelId
     * @return
     */
    boolean deleteModel(String modelId);

    /**
     * 创建审批流程
     *
     * @param businessKey 业务key
     * @param docType     单据类型
     * @return
     */
    String createDocProcess(String businessKey, String docType);

    /**
     * 提交任务
     *
     * @param docCode
     * @param typeName
     * @param dataMap
     */
    void submitDocTask(String docCode, String typeName, Map<String, Object> dataMap);

    /**
     * 撤回单据
     *
     * @param docCode
     * @param typeName
     * @param dataMap
     */
    void revokeDocTask(String docCode, String typeName, Map<String, Object> dataMap);

    /**
     * 执行任务
     *
     * @param dto
     */
    void completeTask(ActFowDto dto);


    /**
     * 驳回审批到起点操作
     *
     * @param dto
     */
    void rejectTaskToFirst(ActFowDto dto);

    /**
     * 驳回审批到上一节点操作
     *
     * @param dto
     */
    void rejectTaskToParent(ActFowDto dto);

    /**
     * 驳回审批到任意节点操作
     *
     * @param dto
     */
    void rejectTaskToAny(ActFowDto dto);

    /**
     * 获取编辑器 Json
     *
     * @param modelId
     * @return
     */
    ObjectNode getEditorJson(String modelId);

    /**
     * 保存模型资源
     *
     * @param modelId
     * @param values
     */
    void saveModel(String modelId, MultiValueMap<String, String> values);

    /**
     * 获取模板集
     *
     * @param modelId
     * @return
     */
    String getStencilSet(String modelId);

    /**
     * 激活流程定义
     *
     * @param modelId 流程模型id
     * @return
     */
    boolean suspendOrActivateProcessDefinition(String modelId);

    /**
     * 获取流程实例任务图像
     *
     * @param key
     * @param category
     * @return
     */
    byte[] getTaskImage(String key, String category);

    /**
     * 获取流程实例审批历史记录信息
     *
     * @param dto
     * @return
     */
    Map<String, Object> getUserTaskHistory(ActFowDto dto);

    /**
     * 获取用户待办任务
     *
     * @param dto
     * @return
     */
    PageResultVo<MyTodoVo> getUserTodoTask(ActFowDto dto);

    /**
     * 获取用户已办任务
     *
     * @param dto
     * @return
     */
    PageResultVo<MyDoneVo> getUserDoneTask(ActFowDto dto);

    /**
     * 获取审批流程任务信息
     *
     * @param taskId
     * @return
     */
    FlowData getTaskFlowData(String taskId);

    /**
     * 删除流程信息
     *
     * @param docCode
     * @param docTypeName
     */
    void deleteDocProcess(String docCode, String docTypeName);
}
